From 25518da782785ee317627e330da0a00b6d6e73ac Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Thu, 20 Oct 2016 23:57:51 -0400 Subject: [PATCH] avoid panic when virtual workspace has no members --- src/cargo/core/resolver/encode.rs | 18 +++++++++--------- tests/workspaces.rs | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 47c20b89b..6640e53e3 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -283,14 +283,15 @@ impl<'a, 'cfg> Encodable for WorkspaceResolve<'a, 'cfg> { let root = self.ws.members().max_by_key(|member| { member.name() - }).unwrap().package_id(); + }).map(Package::package_id); let encodable = ids.iter().filter_map(|&id| { - if self.use_root_key && root == id { - return None + match root { + Some(ref root) if !(self.use_root_key && *root == id) => { + Some(encodable_resolve_node(id, self.resolve)) + }, + _ => None, } - - Some(encodable_resolve_node(id, self.resolve)) }).collect::>(); let mut metadata = self.resolve.metadata.clone(); @@ -307,10 +308,9 @@ impl<'a, 'cfg> Encodable for WorkspaceResolve<'a, 'cfg> { let metadata = if metadata.len() == 0 {None} else {Some(metadata)}; - let root = if self.use_root_key { - Some(encodable_resolve_node(&root, self.resolve)) - } else { - None + let root = match root { + Some(root) if self.use_root_key => Some(encodable_resolve_node(&root, self.resolve)), + _ => None, }; EncodableResolve { package: Some(encodable), diff --git a/tests/workspaces.rs b/tests/workspaces.rs index 42ac608da..00bb68bd4 100644 --- a/tests/workspaces.rs +++ b/tests/workspaces.rs @@ -652,6 +652,29 @@ manifest located at: [..] #[test] fn virtual_build() { + let p = project("foo") + .file("Cargo.toml", r#" + [workspace] + members = ["bar"] + "#) + .file("bar/Cargo.toml", r#" + [project] + name = "bar" + version = "0.1.0" + authors = [] + "#) + .file("bar/src/main.rs", "fn main() {}"); + p.build(); + assert_that(p.cargo("build"), + execs().with_status(101) + .with_stderr("\ +error: manifest path `[..]` is a virtual manifest, but this command \ +requires running against an actual package in this workspace +")); +} + +#[test] +fn virtual_build_no_members() { let p = project("foo") .file("Cargo.toml", r#" [workspace] -- 2.30.2